#include "worker.h"
#include "threadPool.h"
#include "taskQueue.h"
int main(int argc,char * argv[])
{
    // ./server 192.168.187.128 1234 4
    ARGS_CHECK(argc,4);

    // 主线程调用makeWorker去创建子线程
    threadPool_t threadPool;// 创建内存
    threadPoolInit(&threadPool,atoi(argv[3]));// 初始化数据结结构
    makeWorker(&threadPool,atoi(argv[3]));// 创建子线程

    int sockfd;
    tcpInit(argv[1],argv[2],&sockfd);
    // 主线程主要是建立连接，并将工作分给子线程干，因此监听连接 --> epoll和select  多路IO复用
    int epfd = epoll_create(1);// 创建epoll实例
    ERROR_CHECK(epfd,-1,"epoll_create");
    epollAdd(epfd,sockfd);// 操作监听集合

    while(1)
    {
        // 等待epoll_wait
        struct epoll_event readySet[1024];
        int readyNum = epoll_wait(epfd,readySet,sizeof(readySet),-1);// 超时时限，-1->无限等待  否则单位毫秒
        // 遍历就绪集合
        for(int i = 0;i<readyNum;i++)
        {
            if(readySet[i].data.fd == sockfd)// 若是客户端接收新连接
            {
                int netfd = accept(sockfd,NULL,NULL);// 不获取客户端的ip以及port
                ERROR_CHECK(netfd,-1,"accept");
                printf("I got connect!\n");
                // 主线程给子线程分配任务(入队)
                pthread_mutex_lock(&threadPool.mutex);
                printf("I am master,I send a netfd = %d\n",netfd);
                enQueue(&threadPool.taskQueue,netfd);
                pthread_cond_signal(&threadPool.cond);
                pthread_mutex_unlock(&threadPool.mutex);
// 将客户端的通信netfd传送道子线程，发完之后不可以close(netfd),因为先打开的连接，再创建的子线程去传递通信socket，因此主子线程共享
            }
        }
    }
    return 0;
}
